#version 330

// 输入从顶点着色器来
in vec2 fragTexCoord;

// 纹理采样器
uniform sampler2D texture0;
uniform vec2 resolution;

// 多边形参数
uniform vec2 points[720];    // 多边形顶点数组
uniform int pointCount;     // 顶点数量
uniform float borderWidth;  // 边框宽度
uniform vec4 borderColor;   // 边框颜色

// 输出颜色
out vec4 finalColor;

// 计算点到线段的最短距离
float distanceToLine(vec2 p, vec2 a, vec2 b)
{
    vec2 pa = p - a;
    vec2 ba = b - a;
    float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);
    return length(pa - ba * h);
}

// 射线法判断点是否在多边形内
bool pointInPolygon(vec2 p)
{
    if (pointCount < 3) return false;
    
    bool inside = false;
    for (int i = 0, j = pointCount - 1; i < pointCount; j = i++)
    {
        // 修复：检查数组索引是否有效
        if (i >= pointCount || j >= pointCount) continue;
        
        vec2 vi = points[i];
        vec2 vj = points[j];
        
        // 修复：避免除零错误
        if (abs(vj.y - vi.y) < 0.001) continue;
        
        if (((vi.y > p.y) != (vj.y > p.y)) &&
            (p.x < (vj.x - vi.x) * (p.y - vi.y) / (vj.y - vi.y) + vi.x))
        {
            inside = !inside;
        }
    }
    return inside;
}

// 判断点是否在多边形边界附近
bool pointNearBorder(vec2 p, float width)
{
    for (int i = 0; i < pointCount; i++)
    {
        int next = (i + 1) % pointCount;
        // 修复：检查数组索引是否有效
        if (i >= pointCount || next >= pointCount) continue;
        
        float dist = distanceToLine(p, points[i], points[next]);
        if (dist <= width)
        {
            return true;
        }
        
        // 修复：同时检查与顶点的距离，确保拐角处也有边框
        float distToVertex = length(p - points[i]);
        if (distToVertex <= width)
        {
            return true;
        }
    }
    return false;
}

void main()
{
    // 计算当前像素在屏幕空间的位置
    vec2 pixelPos = fragTexCoord * resolution;
    
    // 获取原始纹理颜色
    vec4 texColor = texture(texture0, fragTexCoord);
    
    // 修复：先检查边框，再检查内部，确保边框显示优先级更高
    bool nearBorder = pointNearBorder(pixelPos, borderWidth);
    bool inside = pointInPolygon(pixelPos);
    
    // 根据位置关系设置输出颜色
    if (nearBorder)
    {
        // 多边形边界 - 使用边框颜色
        finalColor = borderColor;
    }
    else if (inside)
    {
        // 多边形内部 - 保持原始纹理颜色
        finalColor = texColor;
    }
    else
    {
        // 多边形外部 - 黑色
        finalColor = vec4(0.0, 0.0, 0.0, 1.0);
    }
}